home *** CD-ROM | disk | FTP | other *** search
/ Almathera Ten Pack 3: CDPD 3 / Almathera Ten on Ten - Disc 3: CDPD3.iso / fish / 676-700 / 685 / mcmaster / source / mcmaster.c next >
C/C++ Source or Header  |  1995-03-18  |  63KB  |  1,712 lines

  1. /*
  2.  * © 1992 by Michal Watzl, compiled with DICE
  3.  *
  4.  * Compile Me with: Dcc MCMaster.c -2.0 -proto -o MCMaster
  5.  *
  6.  */
  7.  
  8.  
  9.  
  10.  
  11. #include "MCMaster.h"
  12.  
  13. STRPTR
  14. fitstring(STRPTR cutme, WORD length)
  15. {
  16.     sprintf(uname[29],"%-100s",cutme);                /* I need a global var */
  17.         uname[29][length]='\0';
  18.            return((STRPTR)uname[29]);
  19. }
  20. STRPTR
  21. cutstring(STRPTR cutme, WORD length)
  22. {
  23.     strncpy( uname[28] , cutme , length);
  24.            return((STRPTR)uname[28]);
  25. }
  26.  
  27. VOID
  28. PrintList(ULONG Mode)
  29. {
  30.     LONG i;
  31.     
  32.     if(EasyRequest(printwin,&easyprintl,NULL,what[Mode-MENU_LIST_BASE])!=1) return;
  33.         InitPrinter();
  34.         if(PDOPEN==FALSE){
  35.         usermessage("Error while opening printer!");
  36.         return;
  37.     }
  38.     SendCommand( aSGR4 ,0,0,0,0);
  39.     sprintf( uname[0] , "List of all %s\n\n" , what[Mode-MENU_LIST_BASE] );
  40.     SendBuffer( uname[0] , CMD_WRITE );
  41.     SendCommand( aSGR24 ,0,0,0,0);
  42.  
  43.         for(i=0; i<=LastNode ; i++){
  44.         SendBuffer( LEntry[i].LabelName , CMD_WRITE);
  45.         SendBuffer( "\n" , CMD_WRITE );
  46.     }    
  47.     FORM_FEED;
  48.         ClosePrinter();
  49. }
  50.  
  51. VOID
  52. PrintOut(WORD start,end, UWORD Mode)
  53. {
  54.     WORD     j,i;
  55.     UBYTE    temp[ LINE_LENGTH ];    /* Buffer that will be sent to the printer */
  56.  
  57.         if(EasyRequest(printwin,&easyprint,NULL,(APTR)frommc,cass[frommc].Name[0],cass[frommc].Name[1],cass[frommc].Name[15],cass[frommc].Name[16],(APTR)tomc,cass[tomc].Name[0],cass[tomc].Name[1],cass[tomc].Name[15],cass[tomc].Name[16])==0) return;
  58.         InitPrinter();
  59.         if(PDOPEN==FALSE){
  60.         usermessage("Error while opening printer!");
  61.         return;
  62.     }
  63.     if( Mode == DRAFT )    SendCommand( aDEN1 ,0,0,0,0);
  64.     else            SendCommand( aDEN2 ,0,0,0,0);
  65.  
  66.     for(j=start; j<=end ; j++){
  67.             CPI10;
  68.         sprintf( uname[0], "%-37.37s", ownername[0]);
  69.         SendBuffer( uname[0] , CMD_WRITE );
  70.         LINE_FEED;
  71.  
  72.         sprintf( uname[0], "%-25.25s", ownername[1]);
  73.         SendBuffer( uname[0] , CMD_WRITE );
  74.         CPI15;
  75.         SendBuffer("  Side A: N.R. "      , CMD_WRITE );
  76.         SendBuffer( NR[ cass[j].NR[0] ] , CMD_WRITE );
  77.         LINE_FEED;
  78.  
  79.         CPI10;
  80.         sprintf( uname[0], "%-25.25s", ownername[2]);
  81.         SendBuffer( uname[0] , CMD_WRITE );
  82.         CPI15;
  83.         SendBuffer("  Side B: N.R. ", CMD_WRITE );
  84.         SendBuffer( NR[ cass[j].NR[1] ], CMD_WRITE  );
  85.         LINE_FEED;
  86.         SendBuffer(LINE, CMD_WRITE );
  87.  
  88.             /*
  89.              *    The back of the cover
  90.              */
  91.         SendCommand(aSGR1  ,0,0,0,0); /* BOLD ON */
  92.         SendCommand( aPLD  ,0,0,0,0); /* Part. Line Down */
  93.                 SendBuffer( strcpy( uname[0] , fitstring( cass[j].Name[0]  , 30 ) ), CMD_WRITE  );
  94.         SendCommand(aSGR22 ,0,0,0,0); /* BOLD OFF */
  95.         SendBuffer("'", CMD_WRITE );
  96.         SendBuffer( strcpy( uname[0] , cutstring( cass[j].Name[1]  , 31 ) ) , CMD_WRITE  );
  97.         SendBuffer("'", CMD_WRITE );
  98.  
  99.                 LINE_FEED;
  100.         SendCommand(aSGR1  ,0,0,0,0); /* BOLD ON */
  101.                 SendBuffer( strcpy( uname[0] , fitstring( cass[j].Name[15]  , 30 ) ) , CMD_WRITE );
  102.         SendCommand(aSGR22 ,0,0,0,0); /* BOLD OFF */
  103.         SendBuffer("'", CMD_WRITE );
  104.         SendBuffer( strcpy( uname[0] , cutstring( cass[j].Name[16]  , 31 ) ) , CMD_WRITE );
  105.         SendBuffer("'\r", CMD_WRITE );
  106.         SendCommand( aPLD ,0,0,0,0);        
  107.         SendBuffer( LINE , CMD_WRITE );
  108.  
  109.         sprintf( uname[0] , "\n %-32.32s %-30.30s\n", cass[j].Name[1] , cass[j].Name[16] );
  110.         SendBuffer( uname[0] , CMD_WRITE );
  111.         for(i=2;i<15;i++){
  112.             LINE_FEED;
  113.             if( strlen(cass[j].Name[i   ])!=0) sprintf( uname[0] , "%2d. %-28.28s ", i-1 , cass[j].Name[i] );
  114.             else    sprintf( uname[0] , "%-33.33s" , NULL);
  115.             if( strlen(cass[j].Name[i+15])!=0) sprintf( uname[1] , "%2d. %-27.27s", i-1 , cass[j].Name[i+15]);
  116.             else    uname[1][0]='\0';
  117.             strcat( uname[0] , uname[1] );
  118.             SendBuffer( uname[0] , CMD_WRITE );
  119.         }
  120.         SendCommand( aPLD ,0,0,0,0);
  121.         SendBuffer( "\r" , CMD_WRITE );
  122.         SendBuffer( LINE , CMD_WRITE );
  123.         LINE_FEED;
  124.         if( (float)((j-start) / 2) == (j-start)/ 2 ) FORM_FEED;    /* ff every 2 covers */
  125.     } /* for j */
  126. /*    ResetPrinter();*/
  127.         ClosePrinter();
  128. }
  129.  
  130. WORD
  131. Print()
  132. {
  133.     BOOL leave=FALSE;
  134.     WORD i;
  135.     UWORD PMode=DRAFT;
  136.     STRPTR    Quality[] ={"_Draft","_Letter",NULL};
  137.     frommc = current;
  138.     tomc   = current;
  139.  
  140.     struct NewGadget fromAIn ={ 20, 20,200,14,NULL      ,&TOPAZ80, 0,NULL,vi,NULL};    /* start stringgad */
  141.     struct NewGadget fromATi ={ 20, 40,200,14,NULL      ,&TOPAZ80, 0,NULL,vi,NULL};    /* end stringgad */
  142.     struct NewGadget fromBIn ={420, 20,200,14,NULL      ,&TOPAZ80, 0,NULL,vi,NULL};    /* start stringgad */
  143.     struct NewGadget fromBTi ={420, 40,200,14,NULL      ,&TOPAZ80, 0,NULL,vi,NULL};    /* end stringgad */
  144.     struct NewGadget toAIn     ={ 20, 70,200,14,NULL      ,&TOPAZ80, 0,NULL,vi,NULL};    /* start stringgad */
  145.     struct NewGadget toATi     ={ 20, 90,200,14,NULL      ,&TOPAZ80, 0,NULL,vi,NULL};    /* end stringgad */
  146.     struct NewGadget toBIn     ={420, 70,200,14,NULL      ,&TOPAZ80, 0,NULL,vi,NULL};    /* start stringgad */
  147.     struct NewGadget toBTi     ={420, 90,200,14,NULL      ,&TOPAZ80, 0,NULL,vi,NULL};    /* end stringgad */
  148.     struct NewGadget up1     ={275, 42, 20,11,"<"       ,&TOPAZ80, 1,NULL,vi,NULL};        /* up arrow for 1st*/
  149.     struct NewGadget down1     ={345, 42, 20,11,">"       ,&TOPAZ80, 2,NULL,vi,NULL};        /* down arrow for 1st */
  150.     struct NewGadget up2     ={275, 92, 20,11,"<"       ,&TOPAZ80, 3,NULL,vi,NULL};         /* up arrow for 2nd*/
  151.     struct NewGadget down2     ={345, 92, 20,11,">"       ,&TOPAZ80, 4,NULL,vi,NULL};         /* down arrow for 2nd */
  152.     struct NewGadget pos1     ={300, 40, 40,14,"_FROM MC",&TOPAZ80, 5,PLACETEXT_ABOVE|NG_HIGHLABEL,vi,NULL};         /* up arrow for 2nd*/
  153.     struct NewGadget pos2     ={300, 90, 40,14,"_TO MC"  ,&TOPAZ80, 6,PLACETEXT_ABOVE|NG_HIGHLABEL,vi,NULL};         /* down arrow for 2nd */
  154.     struct NewGadget ok      ={ 40,117, 80,14,"_OK"     ,&TOPAZ80, 7,PLACETEXT_IN   ,vi,NULL};        /* OK gad */
  155.     struct NewGadget cancel     ={520,117, 80,14,"_CANCEL" ,&TOPAZ80, 8,PLACETEXT_IN   ,vi,NULL};         /* CANCEL gad */
  156.     struct NewGadget printq  ={278,113, 10,10,NULL      ,&TOPAZ80, 9,PLACETEXT_RIGHT,vi,NULL};        /* Draft/Letter */
  157.  
  158.     if(!(printcon=CreateContext((struct Gadget **)&printcon)))                                     leave=TRUE;
  159.     if(!(gad=CreateGadget(TEXT_KIND,printcon,&fromATi,GTTX_Border,TRUE,TAG_DONE,0)))                                 leave=TRUE;
  160.     if(!(gad=CreateGadget(TEXT_KIND,gad,&fromAIn,GTTX_Border,TRUE,TAG_DONE,0)))                                        leave=TRUE;
  161.     if(!(gad=CreateGadget(TEXT_KIND,gad,&fromBTi,GTTX_Border,TRUE,TAG_DONE,0)))                                        leave=TRUE;
  162.     if(!(gad=CreateGadget(TEXT_KIND,gad,&fromBIn,GTTX_Border,TRUE,TAG_DONE,0)))                                        leave=TRUE;
  163.     if(!(pos1gad=CreateGadget(INTEGER_KIND,gad,&pos1,GT_Underscore,'_',GTIN_Number,current,TAG_DONE,0)))                   leave=TRUE;
  164.     if(!(gad=CreateGadget(TEXT_KIND,pos1gad,&toATi  ,GTTX_Border,TRUE,TAG_DONE,0)))                                  leave=TRUE;
  165.     if(!(gad=CreateGadget(TEXT_KIND,gad,&toAIn  ,GTTX_Border,TRUE,TAG_DONE,0)))                                        leave=TRUE;
  166.     if(!(gad=CreateGadget(TEXT_KIND,gad,&toBTi  ,GTTX_Border,TRUE,TAG_DONE,0)))                                        leave=TRUE;
  167.     if(!(gad=CreateGadget(TEXT_KIND,gad,&toBIn  ,GTTX_Border,TRUE,TAG_DONE,0)))                                        leave=TRUE;
  168.     if(!(pos2gad=CreateGadget(INTEGER_KIND,gad,&pos2,GT_Underscore,'_',GTIN_Number,current,TAG_DONE,0)))                   leave=TRUE;
  169.     if(!(gad=CreateGadget(BUTTON_KIND,pos2gad,&up1,TAG_DONE,0)))                                                     leave=TRUE;
  170.     if(!(gad=CreateGadget(BUTTON_KIND,gad,&down1,TAG_DONE,0)))                                                         leave=TRUE;
  171.     if(!(gad=CreateGadget(BUTTON_KIND,gad,&up2,TAG_DONE,0)))                                                           leave=TRUE;
  172.     if(!(gad=CreateGadget(BUTTON_KIND,gad,&down2,TAG_DONE,0)))                                                         leave=TRUE;
  173.     if(!(gad=CreateGadget(BUTTON_KIND,gad,&ok,GT_Underscore,'_',TAG_DONE,0)))                                          leave=TRUE;
  174.     if(!(gad=CreateGadget(BUTTON_KIND,gad,&cancel,GT_Underscore,'_',TAG_DONE,0)))                                      leave=TRUE;
  175.     if(!(gad=CreateGadget(MX_KIND,gad,&printq,GTMX_Labels,Quality,GTMX_Spacing,4,GT_Underscore,'_',TAG_DONE,0)))       leave=TRUE;
  176.     if(leave==TRUE){
  177.         usermessage("Trouble while creating gadgets");
  178.         FreeGadgets(printcon);
  179.         return(0);
  180.         }
  181.            printwintag[6].ti_Data = printcon;
  182.     if(!(printwin=OpenWindowTagList(NULL,printwintag))){
  183.         usermessage("Clould not open print window!");
  184.         return(0);}
  185.     DrawBevelBox(printwin->RPort,10,15,620,44,GTBB_Recessed,TRUE,GT_VisualInfo,vi);
  186.     DrawBevelBox(printwin->RPort,10,65,620,44,GTBB_Recessed,TRUE,GT_VisualInfo,vi);
  187.     UpdatePGads(1,0);
  188.     UpdatePGads(2,1);
  189.     leave=FALSE;
  190.     while(leave==FALSE){
  191.         Wait(1<<printwin->UserPort->mp_SigBit);
  192.         while(message = GT_GetIMsg(printwin->UserPort)){
  193.             if( message->Class==IDCMP_GADGETUP){
  194.                 switch( ((struct Gadget *)message->IAddress)->GadgetID ){
  195.                 case 1:    UpdatePGads(frommc-1,0);
  196.                     break;
  197.                 case 2:    UpdatePGads(frommc+1,0);
  198.                     break;
  199.                 case 3:    UpdatePGads(tomc-1  ,1);
  200.                     break;
  201.                 case 4:    UpdatePGads(tomc+1  ,1);
  202.                     break;
  203.                 case 5: if(frommc>tomc) tomc=frommc;
  204.                     UpdatePGads(((struct StringInfo *)pos1gad->SpecialInfo)->LongInt,0);
  205.                     break;
  206.                 case 6:    if(tomc<frommc) frommc=tomc;
  207.                     UpdatePGads(((struct StringInfo *)pos2gad->SpecialInfo)->LongInt,1);
  208.                     break;
  209.                 case 7:    PrintOut(frommc,tomc,PMode);
  210.                     break;
  211.                 case 8:    leave=TRUE;    /* cancel */
  212.                     break;
  213.                 case 9:    PMode=!PMode;
  214.                     break;
  215.                                 } /* Switch */
  216.                         } /* Gadgetup */
  217.             if( message->Class==IDCMP_RAWKEY)
  218.                 switch(message->Code){
  219.                     case    CURSORRIGHT:
  220.                             if(message->Qualifier & SHIFTKEYS) UpdatePGads(tomc+1,1);
  221.                             else    UpdatePGads(frommc+1,0);
  222.                             break;
  223.                     case    CURSORLEFT:
  224.                             if(message->Qualifier & SHIFTKEYS) UpdatePGads(tomc-1,1);
  225.                             else    UpdatePGads(frommc-1,0);
  226.                             break;
  227.                     case    RAW_F:    ActivateGadget( pos1gad , printwin , NULL);
  228.                             break;
  229.                             case    RAW_T:    ActivateGadget( pos2gad , printwin , NULL);
  230.                             break;
  231.                     case    RAW_D:  PMode=DRAFT;
  232.                             GT_SetGadgetAttrs(gad,printwin,NULL,GTMX_Active,PMode,TAG_DONE,0);
  233.                             break;
  234.                     case    RAW_L:    PMode=LQ;
  235.                             GT_SetGadgetAttrs(gad,printwin,NULL,GTMX_Active,PMode,TAG_DONE,0);
  236.                             break;
  237.                     case    RAW_O:    PrintOut(frommc,tomc,PMode);
  238.                                           break;
  239.                                     case    RAW_C:    leave=TRUE;
  240.                                                         break;
  241.                 } /* switch Code */
  242.             if( message->Class==IDCMP_CLOSEWINDOW )    leave=TRUE;
  243.             GT_ReplyIMsg((struct IntuiMessage *)message);
  244.         } /* 1st while */
  245.     } /* 2nd while */
  246.     CloseWindow(printwin);
  247.     FreeGadgets(printcon);
  248. }
  249.  
  250. VOID
  251. UpdatePGads(WORD new, x)        /* Set new strings in Interpret/LPTitle gadgets of the printwindow */
  252. {
  253.     if(new>=1 && new<=LastNode){
  254.         if(x==0){
  255.             frommc=new;
  256.             if(new >tomc) UpdatePGads(new ,1);
  257.             GT_SetGadgetAttrs(pos1gad,printwin,NULL,GTIN_Number,frommc,TAG_DONE,0);
  258.             GT_SetGadgetAttrs(printcon->NextGadget                        ,printwin,NULL,GTTX_Text,cass[frommc].Name[1 ],TAG_DONE);
  259.             GT_SetGadgetAttrs(printcon->NextGadget->NextGadget                ,printwin,NULL,GTTX_Text,cass[frommc].Name[0 ],TAG_DONE);
  260.             GT_SetGadgetAttrs(printcon->NextGadget->NextGadget->NextGadget            ,printwin,NULL,GTTX_Text,cass[frommc].Name[16],TAG_DONE);
  261.             GT_SetGadgetAttrs(printcon->NextGadget->NextGadget->NextGadget->NextGadget    ,printwin,NULL,GTTX_Text,cass[frommc].Name[15],TAG_DONE);
  262.         } else if(x==1){
  263.             tomc=new;
  264.             if(new <frommc) UpdatePGads(new ,0);
  265.             GT_SetGadgetAttrs(pos2gad,printwin,NULL,GTIN_Number,tomc,TAG_DONE,0);
  266.             GT_SetGadgetAttrs(pos1gad->NextGadget                        ,printwin,NULL,GTTX_Text,cass[tomc].Name[1 ],TAG_DONE);
  267.             GT_SetGadgetAttrs(pos1gad->NextGadget->NextGadget                ,printwin,NULL,GTTX_Text,cass[tomc].Name[0 ],TAG_DONE);
  268.             GT_SetGadgetAttrs(pos1gad->NextGadget->NextGadget->NextGadget            ,printwin,NULL,GTTX_Text,cass[tomc].Name[16],TAG_DONE);
  269.             GT_SetGadgetAttrs(pos1gad->NextGadget->NextGadget->NextGadget->NextGadget    ,printwin,NULL,GTTX_Text,cass[tomc].Name[15],TAG_DONE);
  270.         }
  271.     }
  272. }
  273.  
  274. BOOL
  275. RequestMyFile( UWORD Mode )                    /* Get file/dir from the aslrequester */
  276. {
  277.     AslTag[1].ti_Data = window;
  278.     AslTag[6].ti_Data = (screen->Width  - ASLWIDTH )/2;
  279.     AslTag[7].ti_Data = (screen->Height - ASLHEIGHT)/2;
  280.  
  281.     if(!(filerequester=(struct FileRequester *)AllocAslRequest(ASL_FileRequest,AslTag))){
  282.         usermessage("Asl Request failed!\n");
  283.                 return(FALSE);
  284.         }
  285.     if(Mode==FRQ_LOAD){
  286.         AslTag[0].ti_Data=(ULONG)"LOAD";
  287.         AslTag[2].ti_Data=(ULONG)"Load new data set";
  288.         AslTag[3].ti_Data=FILF_PATGAD;
  289.     } else
  290.     {
  291.         AslTag[0].ti_Data=(ULONG)"SAVE";
  292.         AslTag[2].ti_Data=(ULONG)"Save this data set";
  293.         AslTag[3].ti_Data=FILF_PATGAD|FILF_SAVE;
  294.     }
  295.     if(AslRequest(filerequester,AslTag)) return(TRUE);
  296.     return(FALSE);
  297. }
  298.  
  299. VOID
  300. GetIDCMP()                    /* Recieve IDCMP of mainwin and answer */
  301. {
  302.     struct    MenuItem *mi;
  303.     WORD    id,i=0;
  304.     UWORD    code, quali, class;
  305.  
  306.     FOREVER{
  307.         Wait(1<<window->UserPort->mp_SigBit);
  308.         while( message = GT_GetIMsg(window->UserPort) ){
  309.             class=message->Class;
  310.             code =message->Code;
  311.             quali=message->Qualifier;
  312.             switch(class){
  313.                 case IDCMP_MENUPICK:
  314.                     if(mi= (struct MenuItem*)ItemAddress(menu,message->Code))
  315.                     GetMenu((UWORD)GTMENUITEM_USERDATA(mi));
  316.                     break;
  317.                 case IDCMP_MOUSEBUTTONS:    /* Screen to back when clicked in upper line */
  318.                                       if( (screen->MouseY==0) ) ScreenToBack(screen);
  319.                                       break;
  320.                 case IDCMP_GADGETUP:
  321.                     gad=(struct Gadget*)message->IAddress;
  322.                     id=gad->GadgetID;
  323.                     switch(id){
  324.                         case 31:    ChangeCurrent( ((struct StringInfo *)gad->SpecialInfo)->LongInt );    /* The Number-Gadget */
  325.                                 break;
  326.                         case 40:    cass[current].NR[0]=code;
  327.                                 break;
  328.                         case 41:    cass[current].NR[1]=code;
  329.                                 break;
  330.                         case 42:    cass[current].Source[0]=code;
  331.                                 break;
  332.                         case 43:    cass[current].Source[1]=code;
  333.                                 break;
  334.                         case 44:    ChangeCurrent(current+1);
  335.                                 break;
  336.                         case 45:    ChangeCurrent(current-1);
  337.                                 break;
  338.                         case 50:    ChangeCurrent(code+1);
  339.                                 break;
  340.                         default:    if(id>29) break;                    /* the following is only for the strgads */
  341.                                 fastexit=FALSE;                        /* Data has been edited => ask for quit */
  342.                                 if(id==0 || id==1 || id==15 || id==16){            /* Clicked in the title bar */
  343.                                     UpdateNodeName(current);            /* correct the labellist */
  344.                                     if( (current==LastNode+1) && (strlen( si[id].Buffer ) >0) ) AddNode(LEntry[current].LabelName);        /* New MC! */
  345.                                     GT_SetGadgetAttrs(listviewgad,window,NULL,GTLV_Labels,&LabelList,GTLV_Top,current-1,TAG_DONE,0); /* List starts at zero => -1 */
  346.                                 }
  347.                                 if(quali & SHIFTKEYS){                    /* filter all SHIFT+RETURNS */
  348.                                     if( (id==0) & (current>0) ){            /* Previous cass */
  349.                                         ChangeCurrent(current-1);
  350.                                         ActivateGadget(&StrGad[29],window,NULL);
  351.                                         break;
  352.                                     }
  353.                                     ActivateGadget(&StrGad[id-1],window,NULL);    /* Previous StrGads */
  354.                                     break;
  355.                                 }
  356.                                 if( quali & ALTKEYS  ) break;                  /* Exit the strgads! */
  357.                                 if(id==29){
  358.                                     ChangeCurrent(current+1);            /* Last String + RETURN */
  359.                                     ActivateGadget(&StrGad[0],window,NULL);
  360.                                     break;
  361.                                 }
  362.                                 ActivateGadget(gad->NextGadget,window,NULL);        /* Activate Next Str Gad */
  363.                                 break;
  364.                     }
  365.                 case IDCMP_RAWKEY:    i=1;
  366.                             if(quali & SHIFTKEYS ) i=5;
  367.                             if(quali & ALTKEYS   ) i=10;
  368.                             if(code ==CURSORLEFT ){
  369.                                 ChangeCurrent(current-i);
  370.                                 break;
  371.                             }
  372.                             if(code ==CURSORRIGHT){
  373.                                 ChangeCurrent(current+i);
  374.                                 break;
  375.                             }
  376.                             break;
  377.             } /* switch class */
  378.             GT_ReplyIMsg((struct IntuiMessage *)message);
  379.         } /* whille message ... */
  380.     } /* FOREVER */
  381. }
  382.  
  383. WORD
  384. Search( STRPTR name, UWORD Mode )        /* Searches for any thing and set current to found */
  385. {
  386.     WORD    start, j, i, found=-1;        /* Startnumber, MC number, stringnumber and Pos of found string */
  387.     UBYTE    dest[256];
  388.  
  389.     if( ParsePatternNoCase(name,dest,256)==-1 ){
  390.         easyerror.es_TextFormat="Error in search pattern!";
  391.         EasyRequest(window,&easyerror,NULL,NULL);
  392.         return(0);
  393.     }
  394.  
  395.     if( Mode & TOP_SEARCH  )    start=1;
  396.     else                start=current+1;
  397.  
  398.     for( j=start ; j<=LastNode ; j++ ){
  399.         for( i=0 ; i<30 ; i++ ){
  400.             if( Mode & SEARCH_INTER ){
  401.                 if( (i==0) || (i==15) )    if(MatchPatternNoCase(dest,cass[j].Name[i]) == TRUE ){
  402.                                 found=j;
  403.                                 goto gotit;
  404.                             }
  405.             }
  406.             if(Mode&SEARCH_LP){
  407.                 if( (i==1) || (i==16) ) if(MatchPatternNoCase(dest,cass[j].Name[i]) == TRUE ){
  408.                                 found=j;
  409.                                 goto gotit;
  410.                             }
  411.             }
  412.             if(Mode&SEARCH_SONG){
  413.                 if( ((i>1) && (i<15)) || ((i>16) && (i<30)) )    if(MatchPatternNoCase(dest,cass[j].Name[i]) == TRUE ){
  414.                                             found=j;
  415.                                             goto gotit;
  416.                                         }
  417.             }
  418.         } /* end for i */
  419.     } /* end for j */
  420. gotit:
  421.     if(found==-1) {
  422.         easyfound.es_TextFormat=(UBYTE *)"Could not find anything matching with:\n'%s'";
  423.         EasyRequest(window,&easyfound,NULL,name);
  424.     } else
  425.     {
  426.         STRPTR Side="A";
  427.         WORD line;
  428.  
  429.         ChangeCurrent(found);                    /* Jump to new MC */
  430.         line=i+1;
  431.         easyfound.es_TextFormat  ="Found '%s'\non MC %ld, side %s, line %ld\n";
  432.         if(line>14){
  433.             Side=(STRPTR)"B";
  434.             line-=15;
  435.         }
  436.         EasyRequest( window,&easyfound,NULL,cass[j].Name[i],j,Side,line );
  437.     }
  438. }
  439.  
  440. VOID
  441. GetMenu(UWORD n)                    /* Answers the MENU_PICK message */
  442. {
  443.     BOOL    leave=FALSE;
  444.     WORD    found=FALSE;
  445.     UWORD    SMode , column;
  446.  
  447.     switch(n){
  448.     case MENU_PROJ_LOAD:
  449.         if(Load(NULL)==OPEN_ERR){
  450.             easyerror.es_TextFormat="I had some trouble while\nloading '%s'!!\n";
  451.             EasyRequest(window,&easyerror,NULL,filerequester->rf_File);
  452.         }
  453.         break;
  454.     case MENU_PROJ_SAVE:
  455.         if(Save(NULL)==OPEN_ERR){
  456.             easyerror.es_TextFormat="I had some trouble while\nsaving '%s'!!\n";
  457.             EasyRequest(window,&easyerror,NULL,filerequester->rf_File);
  458.         }
  459.         break;
  460.     case MENU_PROJ_ABOUT:
  461.         EasyRequest(window,&easyabout,NULL,NULL);
  462.         break;
  463.     case MENU_PROJ_INFO:
  464.                 struct    Preferences *prefs = NULL;
  465.         STRPTR    pname = "unknown";
  466.  
  467.         prefs=(struct Perferences *)AllocMem( sizeof(struct Preferences) , NULL );
  468.         if( prefs ){
  469.             GetPrefs( prefs, sizeof(struct Preferences ) );
  470.             pname = prefs->PrinterFilename;
  471.             EasyRequest( window,&easyinfo,NULL,(APTR)LastNode,(APTR)MaxCass,(APTR)AvailMem(MEMF_CHIP),(APTR)AvailMem(MEMF_FAST) , pname );
  472.             FreeMem( prefs , sizeof(struct Preferences) );
  473.         }
  474.         break;
  475.     case MENU_PROJ_PRINT:
  476.         Print();
  477.         break;
  478.     case MENU_PROJ_DELETE:
  479.         if( (current>0) && (EasyRequest( window , &easydelete , NULL , (APTR)current , cass[current].Name[0],cass[current].Name[1],cass[current].Name[15],cass[current].Name[16])==1)) RemoveCurrentNode();
  480.         break;
  481.     case MENU_PROJ_QUIT:
  482.         if(fastexit==TRUE) quit(NULL);
  483.         if(EasyRequest(window,&easyquit,NULL,NULL)) quit(NULL);
  484.         break;
  485.     case MENU_LIST_INTER:
  486.     case MENU_LIST_LP:
  487.     case MENU_LIST_SONG:
  488.         struct    Window *msgwin;            /* temp win, which carries the "Sorting..." message */
  489.         UBYTE    entryname[80];
  490.         WORD    i,next=-1,top=0;
  491.  
  492.         struct    NewGadget    listsortgad    = { (screen->Width)-150        , 30 , 100 , 15             , "_SORT"    , &TOPAZ80 , 1 , PLACETEXT_IN , vi , NULL};
  493.         struct    NewGadget    listVgad    = { ((screen->Width)-(screen->Width-20))/2    , 60 , screen->Width-40 , (screen->Height)-65     , "List View"    , &TOPAZ80 , 2 , PLACETEXT_ABOVE , vi , NULL};
  494.         struct    NewGadget    listexitgad    = { 50                         , 30 , 100 , 15             , "_EXIT"          , &TOPAZ80 , 0 , PLACETEXT_IN , vi , NULL};
  495.         struct    NewGadget    listprintgad    = { ((screen->Width)-100)/2    , 30 , 100 , 15             , "_PRINT!"      , &TOPAZ80 , 3 , PLACETEXT_IN , vi , NULL};
  496.         struct    Gadget        *listcon;
  497.  
  498.         strcpy(uname[29],"Listing of all ");
  499.         strcat(uname[29], what[n-MENU_LIST_BASE] );
  500.                 listwintag[0].ti_Data=uname[29];
  501.         CreateList(n);
  502.  
  503.         column = (( screen->Width - 16 -20 -6)/8 - 10)/2;
  504.         if( n == MENU_LIST_SONG ) column = (( screen->Width - 16 -20 -6)/8 - 10)/3;
  505.         switch(n){
  506.             case MENU_LIST_INTER:
  507.                 strcpy( uname[10] , fitstring( "Interpret's Name" , column ));
  508.                 strcpy( uname[11] , fitstring( "Album Name"       , column ));
  509.                 sprintf( uname[20] , "%s %s  MC     ", uname[10] , uname[11]);
  510.                 listVgad.ng_GadgetText= uname[20];
  511.                 break;
  512.             case MENU_LIST_LP:
  513.                 strcpy( uname[10] , fitstring( "Album Name"         , column ));
  514.                 strcpy( uname[11] , fitstring( "Interpret's Name"       , column ));
  515.                 sprintf( uname[20] , "%s %s  MC     ", uname[10] , uname[11]);
  516.                 listVgad.ng_GadgetText= uname[20];
  517.                 break;
  518.             case MENU_LIST_SONG:
  519.                 strcpy( uname[10] , fitstring( "Song Name"        , column ));
  520.                 strcpy( uname[11] , fitstring( "Interpret's Name"       , column ));
  521.                 strcpy( uname[12] , fitstring( "Album Name"         , column ));
  522.                 sprintf( uname[20] , "%s %s %s MC     ", uname[10] , uname[11] , uname[12] );
  523.                 listVgad.ng_GadgetText= uname[20];
  524.                 break;
  525.         }
  526.         leave=FALSE;
  527.         if(!(gad=CreateContext((struct Gadget **)&listcon))) leave=TRUE;
  528.         if(!(gad=CreateGadget(BUTTON_KIND  ,gad,&listexitgad    ,GT_Underscore,'_'    ,TAG_DONE))) leave=TRUE;
  529.         if(!(gad=CreateGadget(BUTTON_KIND  ,gad,&listprintgad    ,GT_Underscore,'_'    ,TAG_DONE))) leave=TRUE;
  530.         if(!(gad=CreateGadget(BUTTON_KIND  ,gad,&listsortgad    ,GT_Underscore,'_'    ,TAG_DONE))) leave=TRUE;
  531.         if(!(gad=CreateGadget(LISTVIEW_KIND,gad,&listVgad    ,GTLV_Labels,&LabelList    ,TAG_DONE))) leave=TRUE;
  532.         if(leave==TRUE){
  533.             usermessage("Could not create Gadgets for ListWin!");
  534.                         FreeGadgets(listcon);
  535.                         return;
  536.         }
  537.         listwintag[3].ti_Data=listcon;
  538.         if(!(listwin=OpenWindowTagList(NULL,listwintag))){
  539.             usermessage("Can't open listwindow!");
  540.             RemakeList();
  541.             FreeGadgets(listcon);
  542.             break;
  543.         }
  544.         GT_SetGadgetAttrs(gad,listwin,NULL,TAG_DONE,0);            /* Refresh Gadget! */
  545.         DrawBevelBox(listwin->RPort,gad->LeftEdge,gad->TopEdge,gad->Width - 16 ,gad->Height,GT_VisualInfo,vi,TAG_DONE,0);
  546.         DrawBevelBox(listwin->RPort,gad->LeftEdge+gad->Width-16,gad->TopEdge, 16 ,gad->Height-16,GT_VisualInfo,vi,TAG_DONE,0);
  547.         leave=FALSE;
  548.         while(leave==FALSE){
  549.             Wait(1<<listwin->UserPort->mp_SigBit);
  550.             while(message=GT_GetIMsg(listwin->UserPort)){
  551.                 switch(message->Class){
  552.                 case IDCMP_GADGETUP:
  553.                     switch( (((struct Gadget *)message->IAddress))->GadgetID){
  554.                     case    0:    leave=TRUE;
  555.                             break;
  556.                     case    1:    msgwin=OpenWindowTags(NULL,
  557.                                 WA_Left,    (screen->Width-250)/2,
  558.                                 WA_Top,        15,
  559.                                 WA_Width,    250,
  560.                                 WA_Height,    11,
  561.                                 WA_Title,    "Sorting all entries",
  562.                                 WA_CustomScreen,screen,
  563.                                 TAG_DONE,0);
  564.                             GT_SetGadgetAttrs(gad,listwin,NULL,GTLV_Labels,NULL,TAG_DONE,0);
  565.                             QuickSort(1,LastNode);
  566.                             GT_SetGadgetAttrs(gad,listwin,NULL,GTLV_Labels,&LabelList,TAG_DONE,0);
  567.                             if(msgwin) CloseWindow(msgwin);
  568.                             break;
  569.                     case    2:    leave=TRUE;
  570.                             strcpy( uname[1] , (STRPTR)&LEntry[message->Code+1].LabelName[ strlen( LEntry[message->Code+1].LabelName)- 3 ] );
  571.                             next=atoi(uname[1]);
  572.                             break;
  573.                     case    3:    PrintList(n); /* send, which type of list is displayed */
  574.                             break;
  575.                                         } /* end of id switch */
  576.                     break;
  577.                 case IDCMP_VANILLAKEY:
  578.                     if(message->Code=='s'){
  579.                         msgwin=OpenWindowTags(NULL,
  580.                             WA_Left,    (screen->Width - 250)/2,
  581.                             WA_Top,        15,
  582.                             WA_Width,    250,
  583.                             WA_Height,    11,
  584.                             WA_Title,    "Sorting all entries",
  585.                             WA_CustomScreen,screen,
  586.                             TAG_DONE,0);
  587.                         GT_SetGadgetAttrs(gad,listwin,NULL,GTLV_Labels,NULL,TAG_DONE,0);
  588.                         QuickSort(1,LastNode);
  589.                         GT_SetGadgetAttrs(gad,listwin,NULL,GTLV_Labels,&LabelList,TAG_DONE,0);
  590.                         if(msgwin) CloseWindow(msgwin);
  591.                     }
  592.                     if(message->Code=='e') leave=TRUE;
  593.                     if(message->Code=='p') PrintList(n);
  594.                     break;
  595.                 case IDCMP_CLOSEWINDOW:
  596.                     leave=TRUE;
  597.                     break;
  598.                             } /* End switch Class */
  599.                 GT_ReplyIMsg((struct IntuiMessage *)message);
  600.             } /* 1st while */
  601.         } /* 2nd while */
  602.         CloseWindow(listwin);
  603.         FreeGadgets(listcon);
  604.         RemakeList();
  605.         if(next!=-1) ChangeCurrent(next);
  606.         break;    /* END OF LIST PART */
  607.     case MENU_SEARCH_INTER:
  608.     case MENU_SEARCH_LP:
  609.     case MENU_SEARCH_SONG:
  610.     case MENU_SEARCH_ANYTHING:
  611.         struct Gadget     *searchcon;
  612.         struct NewGadget searchtxtgad    = {(SREQ_WIDTH-300)/2 , 50             , 300  , 14 , "_Search for..."     , &TOPAZ80 , 0 , PLACETEXT_ABOVE , vi , NULL};
  613.         struct NewGadget searchtopgad    = {20                 , SREQ_HEIGHT-50 , 120  , 20 , "Start at _first"    , &TOPAZ80 , 1 , PLACETEXT_IN    , vi , NULL};
  614.         struct NewGadget searchnextgad    = {SREQ_WIDTH-140     , SREQ_HEIGHT-50 , 120  , 20 , "Search _next"       , &TOPAZ80 , 2 , PLACETEXT_IN    , vi , NULL};
  615.         struct NewGadget searchexitgad    = {(SREQ_WIDTH-80)/2  , SREQ_HEIGHT-50 ,  80  , 20 , "_EXIT"              , &TOPAZ80 , 3 , PLACETEXT_IN    , vi , NULL};
  616.                 SMode=n-MENU_SEARCH_BASE;
  617.         switch(n){
  618.             case MENU_SEARCH_INTER:        searchtxtgad.ng_GadgetText="_Search for interpret's name";
  619.                             strcpy(uname[0],cass[current].Name[0]);
  620.                             break;
  621.             case MENU_SEARCH_LP:        searchtxtgad.ng_GadgetText="_Search for a LP title:";
  622.                             strcpy(uname[0],cass[current].Name[1]);
  623.                             break;
  624.             case MENU_SEARCH_SONG:        searchtxtgad.ng_GadgetText="_Search for song name:";
  625.                             strcpy(uname[0],cass[current].Name[2]);
  626.                              break;
  627.             case MENU_SEARCH_ANYTHING:    searchtxtgad.ng_GadgetText="_Search for any occurance of:";
  628.                             strcpy(uname[0],cass[current].Name[0]);
  629.                              break;
  630.         }
  631.         leave=FALSE;
  632.         if(!(gad=CreateContext((struct Gadget **)&searchcon))) leave=TRUE;
  633.         if(!(gad=CreateGadget( BUTTON_KIND , gad , &searchtopgad  , GT_Underscore , '_' , TAG_DONE))) leave=TRUE;
  634.         if(!(gad=CreateGadget( BUTTON_KIND , gad , &searchnextgad , GT_Underscore , '_' , TAG_DONE))) leave=TRUE;
  635.         if(!(gad=CreateGadget( BUTTON_KIND , gad , &searchexitgad , GT_Underscore , '_' , TAG_DONE))) leave=TRUE;
  636.         if(!(gad=CreateGadget( STRING_KIND , gad , &searchtxtgad  , GT_Underscore , '_' , GTST_String , uname[0] , TAG_DONE))) leave=TRUE;
  637.         if(leave==TRUE){
  638.             usermessage("Could not create gadgets for search window!");
  639.                         FreeGadgets(searchcon);
  640.                         return;
  641.         }
  642.         searchwintag[7].ti_Data = searchcon;
  643.         if(!(searchwin=(struct Window *)OpenWindowTagList(NULL,searchwintag))){
  644.             usermessage("Could not open search requester!");
  645.             FreeGadgets(searchcon);
  646.             break;}
  647.         ActivateGadget(gad,searchwin,NULL);            /* Activate string Gadget */
  648.         leave=FALSE;
  649.         while(leave==FALSE){
  650.             Wait(1<<searchwin->UserPort->mp_SigBit);
  651.             while(message=(struct IntuiMessage *)GT_GetIMsg(searchwin->UserPort)){
  652.                                 switch(message->Class){
  653.                 case    IDCMP_GADGETUP:        /* exit of strgad with return or! searchgadget clicked*/
  654.                     switch( (((struct Gadget *)message->IAddress))->GadgetID ){
  655.                         case    1:    Search(((STRPTR)((struct StringInfo *)(gad->SpecialInfo))->Buffer),SMode|TOP_SEARCH);
  656.                                 break;
  657.                         case    2:    Search(((STRPTR)((struct StringInfo *)(gad->SpecialInfo))->Buffer),SMode|NEXT_SEARCH);
  658.                                 break;
  659.                                             case    3:    leave=TRUE;
  660.                                                     break;} /* end switch ID*/
  661.                                     break;
  662.                 case    IDCMP_CLOSEWINDOW:
  663.                     leave=TRUE;
  664.                                         break;
  665.                 case    IDCMP_VANILLAKEY:
  666.                     if(message->Code=='f')    Search(((STRPTR)((struct StringInfo *)(gad->SpecialInfo))->Buffer),SMode|TOP_SEARCH);
  667.                     if(message->Code=='n')    Search(((STRPTR)((struct StringInfo *)(gad->SpecialInfo))->Buffer),SMode|NEXT_SEARCH);
  668.                     if(message->Code=='s')    ActivateGadget(gad,searchwin,NULL);            /* Activate string Gadget */
  669.                     if(message->Code=='e')    leave=TRUE;
  670.                                     break;
  671.                                 } /* End IDCMP switch */
  672.                 GT_ReplyIMsg((struct IntuiMessage *)message);
  673.             } /* 1st while */
  674.         } /* 2nd while */
  675.         CloseWindow(searchwin);
  676.         FreeGadgets(searchcon);
  677.         break;
  678.     case MENU_SPECIAL_NAME:
  679.         struct Gadget     *namecon,*g1,*g2,*g3;
  680.         struct NewGadget name1gad    = {50 , 20 , 300 , 14 ,NULL, &TOPAZ80 , 0 , NULL , vi , NULL};
  681.         struct NewGadget name2gad    = {50 , 40 , 300 , 14 ,NULL, &TOPAZ80 , 1 , NULL , vi , NULL};
  682.         struct NewGadget name3gad    = {50 , 60 , 300 , 14 ,NULL, &TOPAZ80 , 2 , NULL , vi , NULL};
  683.         struct NewGadget nameexitgad    = {150, 80 , 100 , 14 ,"OK", &TOPAZ80 , 3 , PLACETEXT_IN , vi , NULL};
  684.  
  685.         leave=FALSE;
  686.         if(!(gad=CreateContext((struct Gadget **)&namecon))) leave=TRUE;    /* Create the Gadget context */
  687.         if(!(g1= CreateGadget( STRING_KIND , gad , &name1gad     , GTST_String , ownername[0] , TAG_DONE ))) leave=TRUE;
  688.         if(!(g2= CreateGadget( STRING_KIND , g1  , &name2gad     , GTST_String , ownername[1] , TAG_DONE ))) leave=TRUE;
  689.         if(!(g3= CreateGadget( STRING_KIND , g2  , &name3gad     , GTST_String , ownername[2] , TAG_DONE ))) leave=TRUE;
  690.         if(!(gad=CreateGadget( BUTTON_KIND , g3  , &nameexitgad  , GT_Underscore , '_' , TAG_DONE )))    leave=TRUE;
  691.         if(leave==TRUE){
  692.             usermessage("Can't create gadgets for namewindow");
  693.             FreeGadgets(namecon);
  694.             return;
  695.                 }
  696.         namewintag[7].ti_Data = namecon;
  697.         if(!(namewin=OpenWindowTagList(NULL,namewintag))){
  698.             usermessage("Could not open name requester!");
  699.             FreeGadgets(namecon);
  700.             break;}
  701.         leave=FALSE;
  702.         ActivateGadget(g1,namewin,NULL);        /* Activate string Gadget */
  703.         while(leave==FALSE){
  704.             Wait(1<<namewin->UserPort->mp_SigBit);
  705.             while(message=GT_GetIMsg(namewin->UserPort)){
  706.                 if( (message->Class)==IDCMP_GADGETUP ){
  707.                     switch((((struct Gadget *)message->IAddress))->GadgetID){
  708.                         case 0:
  709.                         case 1:    ActivateGadget(((struct Gadget *)message->IAddress)->NextGadget,namewin,NULL);
  710.                             break;
  711.                         case 2:    ActivateGadget(g1,namewin,NULL);
  712.                             break;
  713.                         case 3:    leave=TRUE;
  714.                             break;} /* End of Switch */
  715.                 } /* if */
  716.                 if( message->Class==CLOSEWINDOW ) leave=TRUE;
  717.                 GT_ReplyIMsg((struct IntuiMessage *)message);
  718.             } /* 1st while */
  719.         } /* 2nd while */
  720.         strcpy(ownername[0],((struct StringInfo *)(g1->SpecialInfo))->Buffer);
  721.         strcpy(ownername[1],((struct StringInfo *)(g2->SpecialInfo))->Buffer);
  722.         strcpy(ownername[2],((struct StringInfo *)(g3->SpecialInfo))->Buffer);
  723.         CloseWindow(namewin);
  724.         FreeGadgets(namecon);
  725.         break;
  726.     case MENU_SPECIAL_EDIT:
  727.         ActivateGadget(&StrGad[0],window,NULL);
  728.         break;
  729.     case MENU_SPECIAL_PALETTE:
  730.         Palette();
  731.         break;
  732.     } /* end switch */
  733. }
  734.  
  735. VOID
  736. CreateList(ULONG Mode)
  737. {
  738.     UWORD column;
  739.     WORD j=1,i,k=1,l=1,m=0;
  740.         struct Window *msgwin;                /* this window will tell you, that I am creatin the list */
  741.  
  742.     msgwin=OpenWindowTags(NULL, WA_Title,"Creating List...",
  743.         WA_Left        ,(screen->Width-200)/2,
  744.         WA_Top        ,(screen->Height-10)/2,
  745.         WA_Width    ,200,
  746.         WA_Height    ,10,
  747.         WA_CustomScreen    ,screen,
  748.         TAG_END);
  749.     GT_SetGadgetAttrs(listviewgad,window,NULL,GTLV_Labels,NULL,TAG_DONE,0); /* Remove current List from Gadget */
  750.     InitList();
  751.  
  752.     column = (( screen->Width - 16 -20 -6)/8 - 10)/2;
  753.     if( Mode == MENU_LIST_SONG ) column = (( screen->Width - 16 -20 -6)/8 - 10)/3;
  754.  
  755.     while( strlen(cass[j].Name[0])!=0 ){
  756.         switch(Mode){
  757.         case MENU_LIST_INTER:
  758.             strcpy( uname[10] , fitstring( cass[j].Name[0]  , column ) );
  759.             strcpy( uname[11] , fitstring( cass[j].Name[1]  , column ) );
  760.             sprintf(LEntry[k].LabelName,"%-s %-s %3d",uname[10],uname[11], j );
  761.             AddNode(LEntry[k++].LabelName);
  762.  
  763.             strcpy( uname[10] , fitstring( cass[j].Name[15] , column ) );
  764.             strcpy( uname[11] , fitstring( cass[j].Name[16] , column ) );
  765.             sprintf(LEntry[k].LabelName,"%-s %-s %3d",uname[10],uname[11], j);
  766.             AddNode(LEntry[k].LabelName);
  767.             k++;    /* For the Label index */
  768.             break;
  769.         case MENU_LIST_LP:
  770.             strcpy( uname[10] , fitstring( cass[j].Name[1]  , column ) );
  771.             strcpy( uname[11] , fitstring( cass[j].Name[0]  , column ) );
  772.             sprintf(LEntry[k].LabelName,"%-s %-s %3d",uname[10],uname[11], j );
  773.             AddNode(LEntry[k++].LabelName);
  774.  
  775.             strcpy( uname[10] , fitstring( cass[j].Name[16] , column ) );
  776.             strcpy( uname[11] , fitstring( cass[j].Name[15] , column ) );
  777.             sprintf(LEntry[k].LabelName,"%-s %-s %3d",uname[10],uname[11], j);
  778.             AddNode(LEntry[k].LabelName);
  779.             k++;    /* For the Label index */
  780.             break;
  781.         case MENU_LIST_SONG:
  782.             for(m=2;m<30;m++){
  783.                 if( strlen(cass[j].Name[m])==0 || m==15 || m==16) continue;
  784.                 strcpy(uname[0], fitstring( cass[j].Name[m] , column ));        /* Songname */
  785.                 strcpy(uname[1], fitstring( cass[j].Name[0] , column ));        /* Side A Inter */
  786.                 strcpy(uname[2], fitstring( cass[j].Name[1] , column ));        /* Album */
  787.                 if(m>15){
  788.                     strcpy(uname[1], fitstring( cass[j].Name[15] , column ));    /* Side B Inter */
  789.                     strcpy(uname[2], fitstring( cass[j].Name[16] , column ));    /* Album */
  790.                 }
  791.                 sprintf(LEntry[k].LabelName,"%s %s %s %3d",uname[0],uname[1],uname[2], j);
  792.                 AddNode(LEntry[k++].LabelName);    /* Increase Label index */
  793.             } /* end while */
  794.             break;
  795.         } /* end switch */
  796.         if(j>MAXNODES) break;        /* Safety test for eternal loops*/
  797.         j++;    /* For the MC index */
  798.  
  799.     } /* end while */
  800.         if(msgwin) CloseWindow(msgwin);
  801. }
  802.  
  803. VOID
  804. QuickSort(REGISTER WORD start, end)            /* Recursive sort algorithm, very effective */
  805. {
  806.     REGISTER WORD m,l,r;
  807.     REGISTER UBYTE    v[MAXLCHARS], hilf[MAXLCHARS];
  808.  
  809.     if(start<end)
  810.     {
  811.         m=(start+end)/2;
  812.         strcpy(v,LEntry[m].LabelName);
  813.         l=start;
  814.         r=end;
  815.         while(l<=r){
  816.             while( Stricmp(LEntry[l].LabelName,v) <0 ) l++;
  817.             while( Stricmp(LEntry[r].LabelName,v) >0 ) r--;
  818.             if(l<=r){
  819.                 strcpy(hilf         , LEntry[r].LabelName);
  820.                 strcpy(LEntry[r].LabelName, LEntry[l].LabelName);
  821.                 strcpy(LEntry[l].LabelName, hilf);
  822.                 r--;
  823.                 l++;
  824.             }
  825.         }
  826.         QuickSort(start,r  );
  827.         QuickSort(l    ,end);
  828.     }
  829. }
  830.  
  831. VOID
  832. RemakeList( VOID )                /* Remake the ListViewgadget's List after overriding it with the ListList */
  833. {
  834.     InitList();
  835.     UpdateList();
  836.     GT_SetGadgetAttrs(listviewgad,window,NULL,GTLV_Labels,&LabelList,TAG_DONE);
  837. }
  838.  
  839. VOID
  840. UpdateNodeName(WORD n)    /* Remake the Nodestring of an MC */
  841. {
  842.     strcpy( uname[10] , fitstring( cass[n].Name[0]  , (screen->Width - 40)/8/4-1 ) );
  843.     strcpy( uname[11] , fitstring( cass[n].Name[1]  , (screen->Width - 40)/8/4-2 ) );
  844.     strcpy( uname[12] , fitstring( cass[n].Name[15] , (screen->Width - 40)/8/4-1 ) );
  845.     strcpy( uname[13] , fitstring( cass[n].Name[16] , (screen->Width - 40)/8/4-2 ) );
  846.  
  847.     sprintf( LEntry[n].LabelName , "A: %s %s  B: %s %s" , uname[10] , uname[11] , uname[12] , uname[13] );
  848. }
  849.  
  850. VOID
  851. RemoveCurrentNode( VOID )            /* Delete the Current Node and adjust the list pointers */
  852. {
  853.     WORD j,i;
  854.  
  855.     if(LastNode<2) return;
  856.  
  857.     for(j=current ; j<LastNode ; j++)
  858.         {
  859.         for(i=0; i<30; i++)    strcpy( cass[j].Name[i] , cass[j+1].Name[i] );
  860.         cass[j+1].NR[0]=cass[j].NR[0];
  861.         cass[j+1].NR[1]=cass[j].NR[1];
  862.         cass[j+1].Source[0]=cass[j].Source[0];
  863.         cass[j+1].Source[1]=cass[j].Source[1];
  864.         }
  865.  
  866.     LastNode--;                        /* Decrement LastNode */
  867.     LEntry[LastNode].Label.ln_Succ = &TailNode;
  868.     TailNode.ln_Pred     = &LEntry[LastNode].Label;
  869.         LabelList.lh_TailPred    = &LEntry[LastNode].Label;
  870.  
  871.     RefreshGads(current);
  872.     UpdateList();
  873.     GT_SetGadgetAttrs(listviewgad,window,NULL,GTLV_Labels,&LabelList,TAG_DONE,0);
  874. }
  875.  
  876. VOID
  877. wbmain(struct WBStartup* wbmsg)
  878. {
  879.     UBYTE tt[80];
  880.         BPTR old,new;
  881.  
  882.     if(!(IconBase=(struct IconBase*)OpenLibrary("icon.library",0)))            exit(0);
  883.     if(!(UtilityBase=(struct UtilityBase*)OpenLibrary("utility.library",37)))    exit(0);
  884.  
  885.     strcpy (myname, wbmsg->sm_ArgList->wa_Name);
  886.     if(!(new=DupLock( wbmsg->sm_ArgList->wa_Lock)))        exit(0);
  887.         old=CurrentDir(new);
  888.     mydob = GetDiskObjectNew(myname);
  889.     CurrentDir(old);
  890.     UnLock(new);
  891.  
  892.     strcpy( tt , FindToolType((mydob->do_ToolTypes),"DISPLAYID") );
  893.     if( strlen(tt) == 10)    DisplayID = ahex2ulong( tt );
  894.     else DisplayID = HIRES_KEY;
  895.  
  896.     strcpy( tt , FindToolType((mydob->do_ToolTypes),"COLORS"));
  897.     strncat(toolstr[1],tt,12);
  898.     if(strlen(tt)==12){
  899.         strcpy(Colors,tt);
  900.         }
  901.  
  902.     strcpy( tt , FindToolType((mydob->do_ToolTypes),"DATABASE"));
  903.     if(strlen(tt)!=0) strcpy(Database,tt);
  904.  
  905.     strcpy( tt , FindToolType((mydob->do_ToolTypes),"MAXCASS"));
  906.         if( atoi(tt) > 0 ) MaxCass=atoi(tt);
  907.  
  908.     strcpy( tt , FindToolType((mydob->do_ToolTypes),"OSCAN"));
  909.     Oscan=NULL;
  910.     if( Stricmp(tt,"TEXT"    )==0)    Oscan=OSCAN_TEXT;
  911.     if( Stricmp(tt,"STANDARD")==0)    Oscan=OSCAN_STANDARD;
  912.     if( Stricmp(tt,"MAX"     )==0)    Oscan=OSCAN_MAX;
  913.     if( Stricmp(tt,"VIDEO"   )==0)    Oscan=OSCAN_VIDEO;
  914.  
  915.         CurrentDir( ((struct Process *)FindTask(NULL))->pr_HomeDir );    /* set home dir */
  916.     main(0,NULL);                            /* give no parameters on a wbstart */
  917. }
  918.  
  919. VOID
  920. fromcli(WORD argc, STRPTR *argv)
  921. {
  922.         STRPTR    template = "-s/K,-f/K,-c/K,-m/K,-o/K";
  923.     STRPTR     args[5];
  924.     WORD    i;
  925.  
  926.     if(!(UtilityBase=(struct UtilityBase*)OpenLibrary("utility.library",37)))    exit(0);
  927.     if(!(cliargs=(struct RDArgs *)ReadArgs(template,args,NULL))){
  928.         Printf("Usage:\n MCMaster %s\n © 1992 by Michael Watzl\n", (LONG)template );
  929.         PutStr("\n-s  DisplayID:  Hex number in the form of 0x00000000 (look at WBStartup/mode-names!)\n");
  930.         PutStr("\n-f  DataBase:   Path/Name of Datafile to be loaded at once\n\t\tdefault is none\n");
  931.         PutStr("\n-c  Colors:     give 12 hexchars in the form rgbrgbrgbrgb (red, green, blue)\n                e.g. 89A002FFFEB2 (defaults)\n");
  932.         PutStr("\n-m  MaxCass:    number of maximal needed MCs, default is 60\n\n");
  933.         PutStr("\n-o  OverScan:   TEXT, STANDARD, MAX or VIDEO, default is no overscan\n\n");
  934.         exit(0);
  935.     }
  936.     if( Stricmp(args[0],"PAL")==0 )    DisplayID=PAL;
  937.     strcpy(Database, args[1]);
  938.     if( strlen(args[2]) == 12 )     strcpy( Colors,args[2] );
  939.     if( atoi(args[3]) !=0 )     MaxCass = atoi(args[3]);
  940.         for(i=0;i<5;i++)        if( Stricmp( args[4],OscanName[i] ) == 0 ) Oscan=i;
  941.     FreeArgs(cliargs);
  942. }
  943.  
  944. BOOL
  945. getmem(WORD number)
  946. {
  947.     if(cass=(struct MCData    *)AllocMem( sizeof(struct MCData) * (number+1)   , MEMF_CLEAR ) ){
  948.         if( LEntry=(struct ListEntry *)AllocMem( sizeof(struct ListEntry)*number*2*13 , MEMF_CLEAR ) ){
  949.             return(TRUE);
  950.         }
  951.         FreeMem(cass, sizeof(struct MCData) * number );
  952.     }
  953.     PutStr("Can't allocate enough memory, try to free mem, or set the maxcass value lower!\n");
  954.     if(mydob)        FreeDiskObject(mydob);
  955.     exit(0);
  956. }
  957.  
  958. VOID
  959. main(WORD argc, STRPTR *argv)
  960. {
  961.     BOOL leave=FALSE;
  962.     struct DimensionInfo dim;
  963.  
  964.     if( mydob==NULL ) fromcli(argc,argv);
  965.     if( getmem(MaxCass)==FALSE ) quit("Could not get enough memory for requested number of cassettes!");
  966.     if(!(UtilityBase)) /* May already be opened in wbmain! */
  967.         if(!(UtilityBase=(struct UtiltyBase *)OpenLibrary("utility.library",37L)))
  968.             quit("Clould not open utility.library V37!\n");
  969.     if(!(IconBase)) /* May already be opened in wbmain! */
  970.         if(!(IconBase=(struct IconBase *)OpenLibrary("icon.library",37L)))
  971.             quit("Clould not open icon.library V37!\n");
  972.     if(!(IntuitionBase=(struct IntuitionBase *)OpenLibrary("intuition.library",37L)))
  973.         quit("Clould not open intuition.library V37!\n");
  974.     if(!(GfxBase=(struct GfxBase *)OpenLibrary("graphics.library",37L)))
  975.         quit("Clould not open graphics.library V37!\n");
  976.     if(!(GadToolsBase=(struct GadToolsBase *)OpenLibrary("gadtools.library",0L)))
  977.         quit("Clould not open gadtools.library!\n");
  978.     if(!(AslBase=(struct AslBase *)OpenLibrary("asl.library",37L)))
  979.         quit("Clould not open asl.library V37!\n");
  980.  
  981.     screentag[9].ti_Data    = Oscan;
  982.     screentag[6].ti_Data=DisplayID;
  983.  
  984.     GetDisplayInfoData( NULL , (UBYTE *)&dim , sizeof( dim ) , DTAG_DIMS , DisplayID );
  985.     switch( Oscan ){
  986.     case OSCAN_TEXT:
  987.         screentag[1].ti_Data = dim.TxtOScan.MaxX+1;
  988.         screentag[2].ti_Data = dim.TxtOScan.MaxY+1;
  989.         break;
  990.     case OSCAN_STANDARD:
  991.         screentag[1].ti_Data = dim.StdOScan.MaxX+1;
  992.         screentag[2].ti_Data = dim.StdOScan.MaxY+1;
  993.         break;
  994.     default:
  995.         screentag[1].ti_Data = dim.Nominal.MaxX+1;
  996.         screentag[2].ti_Data = dim.Nominal.MaxY+1;
  997.         screentag[0].ti_Data = (dim.MaxOScan.MaxX - dim.Nominal.MaxX)/2;
  998.         break;
  999.     }
  1000.  
  1001.     SetScreenColors();                                /* Set colors in the colorspec */
  1002.  
  1003.     if(!(screen=OpenScreenTagList(NULL,screentag))) quit("Can't open screen!\n");
  1004.     if(!(vi=GetVisualInfoA(screen,NULL)))        quit("Can't get visual info!\n");
  1005.     if(!(gad=CreateContext((struct Gadget **)&congad)))        /* Create the Gadget context */
  1006.         quit("Can't create context!\n");
  1007.     InitList();
  1008.     InitGads();
  1009.     InitTags();
  1010.     if(!(sourceAgad  = CreateGadget( CYCLE_KIND   , gad,&SourceA ,GTCY_Labels , Source , TAG_DONE)))        leave=TRUE;
  1011.     if(!(sourceBgad  = CreateGadget( CYCLE_KIND   , sourceAgad   ,&SourceB, GTCY_Labels , Source , TAG_DONE)))    leave=TRUE;
  1012.     if(!(noiseAgad   = CreateGadget( CYCLE_KIND   , sourceBgad   ,&DolbyA , GTCY_Labels , NR , TAG_DONE)))        leave=TRUE;
  1013.     if(!(noiseBgad   = CreateGadget( CYCLE_KIND   , noiseAgad    ,&DolbyB , GTCY_Labels , NR , TAG_DONE)))        leave=TRUE;
  1014.     if(!(listviewgad = CreateGadget( LISTVIEW_KIND, noiseBgad    ,&ListVG , GTLV_Labels , &LabelList,TAG_DONE)))    leave=TRUE;
  1015.     if(!(nextgad     = CreateGadget( BUTTON_KIND  , listviewgad  ,&Next , GA_Immediate , TRUE , TAG_DONE)))        leave=TRUE;
  1016.     if(!(prevgad     = CreateGadget( BUTTON_KIND  , nextgad      ,&Prev , GA_Immediate , TRUE , TAG_DONE)))        leave=TRUE;
  1017.     if(!(currentgad  = CreateGadget( INTEGER_KIND , prevgad      ,&Current , GTIN_Number , 1 , GTIN_MaxChars , 5 , STRINGA_Justification , GACT_STRINGCENTER , TAG_DONE)))    leave=TRUE;
  1018.     if(leave==TRUE)    quit("Error while creating gadgets for the mainwindow!");
  1019.  
  1020.     if(!(window = OpenWindowTags(NULL,
  1021.         WA_Flags    ,WFLG_ACTIVATE|WFLG_BORDERLESS,
  1022.         WA_IDCMP    ,IDCMP_CLOSEWINDOW | IDCMP_RAWKEY | LISTVIEWIDCMP | STRINGIDCMP | IDCMP_MENUPICK ,
  1023.         WA_Gadgets    ,&StrGad[0],
  1024.         WA_CustomScreen    ,screen,
  1025.         TAG_DONE    ,0))) quit("Could not open window!\n");
  1026.     CompleteGads(&ListVG);                    /* Draw some BevelBoxes */
  1027.     DrawBevelBox(window->RPort,listviewgad->LeftEdge,listviewgad->TopEdge,listviewgad->Width - 16 ,listviewgad->Height,GT_VisualInfo,vi,TAG_DONE,0);
  1028.     DrawBevelBox(window->RPort,listviewgad->LeftEdge+listviewgad->Width-16,listviewgad->TopEdge, 16 ,listviewgad->Height-16,GT_VisualInfo,vi,TAG_DONE,0);
  1029.  
  1030.         olderrwin = ((struct Process *)FindTask(NULL))->pr_WindowPtr;
  1031.     ((struct Process *)FindTask(NULL))->pr_WindowPtr=window;
  1032.  
  1033.     menu=CreateMenus(MainMenu,TAG_DONE,0);
  1034.     LayoutMenus(menu,vi,TAG_DONE,0);
  1035.     SetMenuStrip(window,menu);
  1036.     if(strlen(Database)!=0) Load(Database);
  1037.     GetIDCMP();
  1038. }
  1039.  
  1040. WORD
  1041. Save(STRPTR startname)
  1042. {
  1043.     WORD    i,j;
  1044.     BPTR    fh;
  1045.     UBYTE    fname[128];
  1046.  
  1047.     AslTag[4].ti_Data=lastfname;
  1048.     AslTag[5].ti_Data=lastdname;
  1049.     if( RequestMyFile(FRQ_SAVE) == FALSE )
  1050.         return(CANCEL_ERR);
  1051.     strcpy(lastfname,filerequester->rf_File);
  1052.     strcpy(lastdname,filerequester->rf_Dir);
  1053.     strcpy(fname,filerequester->rf_Dir);
  1054.     if( (fname[strlen(fname)-1]!=':') && (fname[0]!='\0')) strcat(fname,(STRPTR)"/");
  1055.     strcat(fname,filerequester->rf_File);
  1056.     fh=Open(fname,MODE_NEWFILE);
  1057.     if(fh==DOSFALSE)    return(OPEN_ERR);
  1058.     FPutC(fh,CODE);
  1059.     for(i=0;i<3;i++){
  1060.         FPuts(fh,ownername[i]);                /* put the  ownername */
  1061.         FPutC(fh,'\n');
  1062.     }
  1063.     for(j=1;j<=LastNode;j++){                /* first to last MC */
  1064.         for(i=0;i<30;i++){
  1065.             FPuts(fh,cass[j].Name[i]);        /* put the 30 songtitles */
  1066.             FPutC(fh,'\n');
  1067.         }
  1068.         FPutC(fh,cass[j].NR[0]    +48);
  1069.         FPutC(fh,cass[j].NR[1]    +48);
  1070.         FPutC(fh,cass[j].Source[0]+48);
  1071.         FPutC(fh,cass[j].Source[1]+48);
  1072.     }
  1073.     ChangeCurrent(current);
  1074.     Close(fh);
  1075.     fastexit=TRUE;
  1076.     return(TRUE);
  1077. }
  1078.  
  1079. WORD
  1080. Load(STRPTR startname)
  1081. {
  1082.     WORD    i,j;
  1083.     BOOL    end=FALSE;
  1084.     BPTR    fh;
  1085.     UBYTE    modes[5];    /* for 2x N.R. and 2x Source */
  1086.     UBYTE    fname[128];    /* all stuff */
  1087.  
  1088.     AslTag[4].ti_Data=lastfname;            /* defaultname setzten */
  1089.     AslTag[5].ti_Data=lastdname;            /* defaultdir setzten */
  1090.     if(startname==0){
  1091.         if(!(RequestMyFile(FRQ_LOAD)))            return(CANCEL_ERR);
  1092.         strcpy(fname    ,filerequester->rf_Dir);
  1093.         strcpy(lastfname,filerequester->rf_File);
  1094.         strcpy(lastdname,filerequester->rf_Dir);
  1095.         if((fname[strlen(fname)-1]!=':') && (fname[0]!='\0')) strcat(fname,"/");
  1096.         strcat(fname,filerequester->rf_File);
  1097.         } else
  1098.         {
  1099.             strcpy(fname,startname);
  1100.         strcpy( lastfname , FilePart(startname) );
  1101.         strncpy(lastdname , startname , strlen(startname)-strlen(FilePart(startname)) );
  1102.         }
  1103.     fh=Open(fname,MODE_OLDFILE);
  1104.     if(fh==DOSFALSE) return(OPEN_ERR);
  1105.     InitList();                        /* Reset the Node struct */
  1106.     fname[0]='\0';                        /* clear fname löschen-> for strncats */
  1107.     if(FGetC(fh)!=CODE)    return(FALSE);            /* Check for code */
  1108.     for(i=0;i<3;i++){
  1109.         if(FGets(fh,ownername[i],MAXCHARS)==NULL) return(FALSE);
  1110.         ownername[i][ strlen(ownername[i])-1 ]='\0';
  1111.     }
  1112.     for(j=1;j<MaxCass;j++){                /* maximal MaxCass cassettes */
  1113.         for(i=0;i<30;i++){
  1114.             if(FGets(fh,cass[j].Name[i],MAXCHARS)==NULL) end=TRUE;    /* get the 30 songtitles */
  1115.             cass[j].Name[i][ strlen(cass[j].Name[i])-1 ]='\0';
  1116.         }
  1117.         if(end==TRUE) break;
  1118.         cass[j].NR[0]=        FGetC(fh)-48;
  1119.         cass[j].NR[1]=        FGetC(fh)-48;
  1120.         cass[j].Source[0]=    FGetC(fh)-48;
  1121.         cass[j].Source[1]=    FGetC(fh)-48;
  1122.     }
  1123.     for(i=j;i<MaxCass;i++){
  1124.         cass[i].NR[0]=0;
  1125.         cass[i].NR[1]=0;
  1126.         cass[i].Source[0]=0;
  1127.         cass[i].Source[1]=0;
  1128.     }
  1129.     Close(fh);
  1130.     UpdateList();
  1131.     GT_SetGadgetAttrs(listviewgad,window,NULL,TAG_DONE,0);
  1132.     RefreshGads(1);
  1133.     fastexit=TRUE;
  1134.     return(TRUE);
  1135. }
  1136.  
  1137. STRPTR
  1138. itos(STRPTR string,ULONG integer)    
  1139. {
  1140.     sprintf(string,"%d",integer);
  1141.         return(string);
  1142. }
  1143.  
  1144. VOID
  1145. InitGads()        /* Intitialize/size the gads of the main window */
  1146. {
  1147.     int i=0;
  1148.  
  1149.     for(i=0;i<30;i++){
  1150.         if(i<15){
  1151.             StrGad[i].LeftEdge  = XOFFSET+2;
  1152.             StrGad[i].TopEdge   = YOFFSET+8*i;
  1153.         } else {
  1154.             StrGad[i].LeftEdge  = (screen->Width)/2+XOFFSET+2;
  1155.             StrGad[i].TopEdge   = YOFFSET+8*(i-15);
  1156.         }
  1157.  
  1158.         StrGad[i].Width        = (screen->Width)/2 - (StrGad[0].LeftEdge)*2;
  1159.         StrGad[i].Height    = 10;
  1160.         StrGad[i].GadgetID    = i;
  1161.  
  1162.         if(i!=29)    StrGad[i].NextGadget=&StrGad[i+1];
  1163.         else        StrGad[i].NextGadget=congad;
  1164.  
  1165.         StrGad[i].SpecialInfo=&si[i];
  1166.         si[i].Buffer    =(UBYTE *)cass[0].Name[i];
  1167.         si[i].UndoBuffer=(UBYTE *)uname[i];
  1168.     }
  1169.     StrGad[ 0].TopEdge = YOFFSET-4;
  1170.     StrGad[ 1].TopEdge = YOFFSET-4 + TOPAZ80.ta_YSize;
  1171.     StrGad[15].TopEdge = YOFFSET-4;
  1172.     StrGad[16].TopEdge = YOFFSET-4 + TOPAZ80.ta_YSize;
  1173.  
  1174.     ListVG.ng_VisualInfo    = vi;
  1175.     DolbyA.ng_VisualInfo    = vi;
  1176.     DolbyB.ng_VisualInfo    = vi;
  1177.     SourceA.ng_VisualInfo    = vi;
  1178.     SourceB.ng_VisualInfo    = vi;
  1179.     Next.ng_VisualInfo    = vi;
  1180.     Prev.ng_VisualInfo    = vi;
  1181.     Current.ng_VisualInfo    = vi;
  1182.  
  1183.     ListVG.ng_LeftEdge    = 10;
  1184.     ListVG.ng_TopEdge    = 148;
  1185.     ListVG.ng_Width        = screen->Width-2*ListVG.ng_LeftEdge;
  1186.     ListVG.ng_Height    = screen->Height-ListVG.ng_TopEdge;
  1187.  
  1188.     DolbyA.ng_LeftEdge    = ListVG.ng_LeftEdge;
  1189.     DolbyA.ng_TopEdge    = ListVG.ng_TopEdge-15;
  1190.     DolbyA.ng_Width        = 150;
  1191.     DolbyA.ng_Height    = 13;
  1192.  
  1193.     DolbyB.ng_LeftEdge    = ListVG.ng_LeftEdge+ListVG.ng_Width-DolbyA.ng_Width;
  1194.     DolbyB.ng_TopEdge     = DolbyA.ng_TopEdge;
  1195.     DolbyB.ng_Width       = DolbyA.ng_Width;
  1196.     DolbyB.ng_Height      = DolbyA.ng_Height;
  1197.  
  1198.     Current.ng_Width       = 40;
  1199.     Current.ng_Height      = DolbyA.ng_Height;
  1200.     Current.ng_LeftEdge    = (screen->Width - Current.ng_Width)/2;
  1201.     Current.ng_TopEdge     = DolbyA.ng_TopEdge;
  1202.  
  1203.     Next.ng_LeftEdge    = Current.ng_LeftEdge + Current.ng_Width +10 ;
  1204.     Next.ng_TopEdge     = DolbyA.ng_TopEdge;
  1205.     Next.ng_Width        = 23;
  1206.     Next.ng_Height        = DolbyA.ng_Height;
  1207.  
  1208.     Prev.ng_LeftEdge    = Current.ng_LeftEdge - Next.ng_Width -10;
  1209.     Prev.ng_TopEdge     = DolbyA.ng_TopEdge;
  1210.     Prev.ng_Width       = Next.ng_Width;
  1211.     Prev.ng_Height      = Next.ng_Height;
  1212.  
  1213.     SourceA.ng_Width       = 85;
  1214.     SourceA.ng_Height      = DolbyA.ng_Height;
  1215.     SourceA.ng_LeftEdge    = ( (DolbyA.ng_Width + Prev.ng_LeftEdge ) - SourceA.ng_Width + 10) / 2;
  1216.     SourceA.ng_TopEdge     = DolbyA.ng_TopEdge;
  1217.  
  1218.     SourceB.ng_LeftEdge    = (Next.ng_LeftEdge+Next.ng_Width + DolbyB.ng_LeftEdge - SourceA.ng_Width )/2;
  1219.     SourceB.ng_TopEdge     = DolbyA.ng_TopEdge;
  1220.     SourceB.ng_Width       = SourceA.ng_Width;
  1221.     SourceB.ng_Height      = DolbyA.ng_Height;
  1222. }
  1223.  
  1224. VOID
  1225. InitTags( VOID )
  1226. {
  1227.     printwintag[2].ti_Data = (screen->Width  - 640 ) /2 ;
  1228.     printwintag[3].ti_Data = (screen->Height - 140 ) / 2;
  1229.     printwintag[7].ti_Data = screen;
  1230.  
  1231.     namewintag[3].ti_Data = (screen->Width  - 400)/2;
  1232.     namewintag[4].ti_Data = (screen->Height - 100)/2;
  1233.     namewintag[8].ti_Data = screen;
  1234.  
  1235.     searchwintag[2].ti_Data = ( screen->Width  - SREQ_WIDTH )/2;
  1236.     searchwintag[3].ti_Data = ( screen->Height - SREQ_HEIGHT)/2;
  1237.     searchwintag[8].ti_Data = screen;
  1238.  
  1239.     listwintag[4].ti_Data=screen;
  1240. }
  1241.  
  1242.  
  1243.  
  1244.  
  1245. WORD
  1246. AddNode(STRPTR name)                            /* Add Node to List */
  1247. {
  1248.     if(LastNode<MAXNODES)
  1249.     {
  1250.         LastNode++;
  1251.         LEntry[LastNode].Label.ln_Name=name;
  1252.         if(LastNode>1){
  1253.             LEntry[LastNode].Label.ln_Pred=&LEntry[LastNode-1].Label;    /* Pred to Previous */
  1254.             LEntry[LastNode-1].Label.ln_Succ=&LEntry[LastNode].Label;    /* Suc from prev to current*/
  1255.         }
  1256.         LEntry[LastNode].Label.ln_Succ = &TailNode;
  1257.         TailNode.ln_Pred     = &LEntry[LastNode].Label;
  1258.                 LabelList.lh_TailPred    = &LEntry[LastNode].Label;
  1259.     }
  1260.     return(0);
  1261. }
  1262.  
  1263. VOID
  1264. UpdateList( VOID )                        /* Redo the List from the cass-names */
  1265. {
  1266.     WORD j=1,i;
  1267.     UBYTE fname[100];
  1268.  
  1269.     GT_SetGadgetAttrs(listviewgad,window,NULL,GTLV_Labels,NULL,TAG_DONE); /* Disconnect LabelList from LVG */
  1270.     InitList();
  1271.     while(strlen(cass[j].Name[0])!=0){
  1272.                     UpdateNodeName(j);                /* create string for listviewgad */
  1273.         AddNode(LEntry[j].LabelName);
  1274.         if(j>MaxCass) break;
  1275.         j++;
  1276.     }
  1277.     GT_SetGadgetAttrs(listviewgad,window,NULL,GTLV_Labels,&LabelList,TAG_DONE); /* "Reconnect Gadget and List */
  1278. }
  1279.  
  1280. VOID
  1281. InitList( VOID )                /* Intitialize the NodeList */
  1282. {
  1283.     LabelList.lh_Head    =&LEntry[1].Label;
  1284.         LabelList.lh_Tail    =&TailNode;
  1285.         LabelList.lh_TailPred    =NULL;
  1286.     LastNode=0;
  1287. }
  1288.  
  1289. WORD
  1290. quit(STRPTR errtxt)            /* print errortext, clean up and put returncode */
  1291. {
  1292.     if(errtxt)         usermessage(errtxt);
  1293.  
  1294.     ((struct Process *)FindTask(NULL))->pr_WindowPtr=olderrwin;
  1295.  
  1296.     if(mydob)         FreeDiskObject(mydob);
  1297.     if(menu){          ClearMenuStrip(window);
  1298.                    FreeMenus(menu);}
  1299.     ClosePrinter();
  1300.  
  1301.     if(window)         CloseWindow(window);
  1302.     if(congad)         FreeGadgets(congad);
  1303.     if(filerequester)    FreeAslRequest(filerequester);
  1304.     if(screen)         CloseScreen(screen);
  1305.     if(vi)             FreeVisualInfo(vi);
  1306.  
  1307.     if(AslBase)        CloseLibrary(AslBase);
  1308.     if(GadToolsBase)    CloseLibrary(GadToolsBase);
  1309.     if(GfxBase)        CloseLibrary((struct Library *)GfxBase);
  1310.  
  1311.     if(IntuitionBase)    CloseLibrary((struct Library *)IntuitionBase);
  1312.     if(UtilityBase)        CloseLibrary(UtilityBase);
  1313.  
  1314.     FreeMem( cass   , sizeof(struct MCData) * (MaxCass+1) );
  1315.     FreeMem( LEntry , sizeof(struct ListEntry) * MaxCass *2 * 13);
  1316.  
  1317.     exit(0);
  1318. }
  1319.  
  1320. WORD
  1321. ChangeCurrent(WORD new)            /* Set a new current mc and assign stringbuffers,... */
  1322. {
  1323.     if(new <  1)        new=1;
  1324.     if(new > LastNode+1) new=LastNode+1;            /* Maximal one MC further */
  1325.     if(new==current) return(0);                /* Refresh only when really needed */
  1326.     RefreshGads(new);
  1327. }
  1328.  
  1329. WORD
  1330. RefreshGads(WORD new)                /* Assign Stringbuffers, update topentry of LVG, ... */
  1331. {
  1332.     WORD i;
  1333.     if(cass[new].NR[0]!=cass[current].NR[0])        GT_SetGadgetAttrs( noiseAgad,window,NULL,GTCY_Active,cass[new].NR[0]     ,TAG_DONE);
  1334.     if(cass[new].NR[1]!=cass[current].NR[1])        GT_SetGadgetAttrs( noiseBgad,window,NULL,GTCY_Active,cass[new].NR[1]     ,TAG_DONE);
  1335.     if(cass[new].Source[0]!=cass[current].Source[0])    GT_SetGadgetAttrs(sourceAgad,window,NULL,GTCY_Active,cass[new].Source[0] ,TAG_DONE);
  1336.     if(cass[new].Source[1]!=cass[current].Source[1])    GT_SetGadgetAttrs(sourceBgad,window,NULL,GTCY_Active,cass[new].Source[1] ,TAG_DONE);
  1337.     GT_SetGadgetAttrs(listviewgad,window,NULL,GTLV_Top      ,new-1,TAG_DONE,0);
  1338.     GT_SetGadgetAttrs(currentgad,window ,NULL,GTIN_Number   ,new  ,TAG_DONE,0);
  1339.     current=new;
  1340.     for(i=0;i<30;i++) si[i].Buffer=(UBYTE *)cass[new].Name[i];    /* assign new buffer contents */
  1341.     RefreshGList(&StrGad[0],window,NULL,30);                /* 30 x StringGadget + 1 x NumGadget */
  1342.     return(0);
  1343. }
  1344.  
  1345. VOID
  1346. CompleteGads(struct NewGadget *ng)        /* Complete the Gadget's LayOut */
  1347. {
  1348.     /* For the StrGads Interpret/Title*/
  1349.     DrawBevelBox(window->RPort,StrGad[ 0].LeftEdge-2, StrGad[ 0].TopEdge-1, StrGad[0].Width+6, 2 * TOPAZ80.ta_YSize+2, GT_VisualInfo,vi ,TAG_DONE,0);
  1350.     DrawBevelBox(window->RPort,StrGad[15].LeftEdge-2, StrGad[15].TopEdge-1, StrGad[0].Width+6, 2 * TOPAZ80.ta_YSize+2, GT_VisualInfo,vi ,TAG_DONE,0);
  1351.  
  1352.     /* For the StrGads SongNames*/
  1353.     DrawBevelBox(window->RPort,StrGad[ 0].LeftEdge-2, StrGad[ 2].TopEdge-1, StrGad[0].Width+6, 13 * TOPAZ80.ta_YSize+2, GT_VisualInfo,vi ,TAG_DONE,0);
  1354.     DrawBevelBox(window->RPort,StrGad[15].LeftEdge-2, StrGad[17].TopEdge-1, StrGad[0].Width+6, 13 * TOPAZ80.ta_YSize+2, GT_VisualInfo,vi ,TAG_DONE,0);
  1355. }
  1356.  
  1357. VOID
  1358. usermessage(STRPTR text)                      /* Put an errortext in a requester */
  1359. {
  1360.     if(IntuitionBase){
  1361.         struct Window *win;
  1362.         easyerror.es_TextFormat=text;
  1363.         if(screen) win=window;
  1364.         else    win=IntuitionBase->ActiveScreen->FirstWindow;
  1365.         EasyRequest(win,&easyerror,NULL,NULL);
  1366.     } else PutStr(text);
  1367. }
  1368.  
  1369. VOID
  1370. SetScreenColors( VOID )
  1371. {
  1372.     WORD j;
  1373.     for(j=0;j<4;j++){
  1374.             colorspec[j].ColorIndex    =j;
  1375.             colorspec[j].Red    =c2hex( (WORD)Colors[j*3+0] );
  1376.             colorspec[j].Green    =c2hex( (WORD)Colors[j*3+1] );
  1377.             colorspec[j].Blue    =c2hex( (WORD)Colors[j*3+2] );
  1378.     }
  1379.     colorspec[4].ColorIndex=-1;
  1380.     screentag[8].ti_Data=colorspec;
  1381. }
  1382.  
  1383. WORD
  1384. c2hex(WORD c)
  1385. {
  1386.     c=ToUpper(c);
  1387.     if( (WORD)c > 64 )    return(c-65+10);
  1388.     return((WORD)(c-48));
  1389. }
  1390.  
  1391. WORD
  1392. Palette( VOID )
  1393. {
  1394.     BOOL leave=FALSE;
  1395.     WORD i=0, index=0;    /* index stands for the color number */
  1396.  
  1397.     for(i=0;i<4;i++){     /* col is only temporary */
  1398.         col = GetRGB4( ((struct ViewPort)(screen->ViewPort)).ColorMap , i );
  1399.         col0[2][i] = (UWORD)  (col & (0x000f));
  1400.         col0[1][i] = (UWORD) ((col & (0x00f0)) >> 4);
  1401.         col0[0][i] = (UWORD) ((col & (0x0f00)) >> 8);
  1402.         }
  1403.     struct NewGadget palette =    { 10, 20,270,20,NULL     ,&TOPAZ80,0,NULL          ,NULL,NULL};
  1404.     struct NewGadget rslide  =    { 60, 45,190,15,"Red"    ,&TOPAZ80,1,PLACETEXT_LEFT,NULL,NULL};
  1405.     struct NewGadget gslide  =    { 60, 65,190,15,"Green"  ,&TOPAZ80,2,PLACETEXT_LEFT,NULL,NULL};
  1406.     struct NewGadget bslide  =    { 60, 85,190,15,"Blue"   ,&TOPAZ80,3,PLACETEXT_LEFT,NULL,NULL};
  1407.     struct NewGadget ok     =    { 10,105, 80,15,"_USE"   ,&TOPAZ80,4,PLACETEXT_IN  ,NULL,NULL};
  1408.     struct NewGadget save    =    {100,105, 80,15,"_SAVE"  ,&TOPAZ80,5,PLACETEXT_IN  ,NULL,NULL};
  1409.     struct NewGadget cancel  =    {190,105, 80,15,"_CANCEL",&TOPAZ80,6,PLACETEXT_IN  ,NULL,NULL};
  1410.  
  1411.     palette.ng_VisualInfo    =vi;
  1412.     rslide.ng_VisualInfo    =vi;
  1413.     gslide.ng_VisualInfo    =vi;
  1414.     bslide.ng_VisualInfo    =vi;
  1415.     ok.ng_VisualInfo    =vi;
  1416.     save.ng_VisualInfo    =vi;
  1417.     cancel.ng_VisualInfo    =vi;
  1418.  
  1419.     if(!(gad=CreateContext((struct Gadget **)&palcon)))                    leave=TRUE;
  1420.     if(!(gad=CreateGadget(PALETTE_KIND,gad,&palette,GTPA_Depth,2,GTPA_IndicatorWidth,50,TAG_DONE,0)))    leave=TRUE;
  1421.     if(!(rslider=CreateGadgetA(SLIDER_KIND,gad,&rslide ,SliderItem)))            leave=TRUE;
  1422.     if(!(gslider=CreateGadgetA(SLIDER_KIND,rslider,&gslide ,SliderItem)))            leave=TRUE;
  1423.     if(!(bslider=CreateGadgetA(SLIDER_KIND,gslider,&bslide ,SliderItem)))            leave=TRUE;
  1424.     if(!(gad=CreateGadget(BUTTON_KIND ,bslider,&ok     ,GT_Underscore,'_',TAG_DONE,0)))    leave=TRUE;
  1425.     if(!(gad=CreateGadget(BUTTON_KIND ,gad,&cancel ,GT_Underscore,'_',TAG_DONE,0)))    leave=TRUE;
  1426.     if(!(gad=CreateGadget(BUTTON_KIND ,gad,&save   ,GT_Underscore,'_',TAG_DONE,0)))    leave=TRUE;
  1427.     if(leave!=0)    return(0);
  1428.     if(!(palwin=(struct Window *)OpenWindowTags(NULL,
  1429.         WA_Left        ,(screen->Width  - 290) /2,
  1430.         WA_Top        ,(screen->Height - 130) /2,
  1431.         WA_Width    ,290,
  1432.         WA_Height    ,130,
  1433.         WA_Flags    ,WFLG_ACTIVATE|WFLG_CLOSEGADGET|WFLG_DRAGBAR,
  1434.                 WA_Title    ,"Palette Window",
  1435.         WA_IDCMP    ,IDCMP_CLOSEWINDOW|SLIDERIDCMP|PALETTEIDCMP|IDCMP_MOUSEBUTTONS|IDCMP_MOUSEMOVE|IDCMP_VANILLAKEY,
  1436.         WA_Gadgets    ,palcon,
  1437.         WA_CustomScreen    ,screen,
  1438.         TAG_DONE    ,0))) return(0);
  1439.     DrawBevelBox(palwin->RPort, 67, 19,213, 22,GT_VisualInfo,vi,TAG_DONE,0);
  1440.         DrawBevelBox(palwin->RPort,  9, 19, 52, 22,GTBB_Recessed,TRUE,GT_VisualInfo,vi,TAG_DONE,0);
  1441.     DrawBevelBox(palwin->RPort, 59, 44,192, 17,GT_VisualInfo,vi,TAG_DONE,0);
  1442.     DrawBevelBox(palwin->RPort, 59, 64,192, 17,GT_VisualInfo,vi,TAG_DONE,0);
  1443.     DrawBevelBox(palwin->RPort, 59, 84,192, 17,GT_VisualInfo,vi,TAG_DONE,0);
  1444.  
  1445.     DrawBevelBox(palwin->RPort, 254, 44, 24, 17,GTBB_Recessed,TRUE,GT_VisualInfo,vi,TAG_DONE,0);
  1446.     DrawBevelBox(palwin->RPort, 254, 64, 24, 17,GTBB_Recessed,TRUE,GT_VisualInfo,vi,TAG_DONE,0);
  1447.     DrawBevelBox(palwin->RPort, 254, 84, 24, 17,GTBB_Recessed,TRUE,GT_VisualInfo,vi,TAG_DONE,0);
  1448.         getcolor(index);
  1449.     if(mydob == NULL) OffGadget( gad, palwin, NULL);    /* disable save gad when started from cli */
  1450.     leave=FALSE;
  1451.     while(leave==FALSE){
  1452.                    Wait(1<<palwin->UserPort->mp_SigBit);
  1453.                 while(message=(struct IntuiMessage *)GT_GetIMsg(palwin->UserPort)){
  1454.             switch(message->Class){
  1455.             case IDCMP_CLOSEWINDOW:
  1456.                         leave=TRUE;
  1457.                         break;
  1458.                         case IDCMP_VANILLAKEY:
  1459.                             switch(message->Code){
  1460.                             case    'u':    leave=TRUE;    break;
  1461.                             case    's':    leave=TRUE;    break;
  1462.                             case    'c':    restorecolor();    leave=TRUE;    break;
  1463.                 }
  1464.                         case IDCMP_GADGETUP:
  1465.                 activegad=0;
  1466.                 switch(((struct Gadget*)(message->IAddress))->GadgetID){
  1467.                 case 0:    index=message->Code;
  1468.                     getcolor(index);
  1469.                     break;
  1470.                       case 1:    r[index]=message->Code;
  1471.                     setcolor(index);
  1472.                     break;
  1473.                 case 2:    g[index]=message->Code;
  1474.                     setcolor(index);
  1475.                     break;
  1476.                 case 3:    b[index]=message->Code;
  1477.                     setcolor(index);
  1478.                     break;
  1479.                                 case 4:    leave=TRUE;
  1480.                                     break;
  1481.                                 case 5:    leave=TRUE;
  1482.                                     uname[9][0]='\0';    /* for the colors-string */
  1483.                     for(i=0;i<4;i++){
  1484.                         getcolor(i);
  1485.                         uname[9][0+i*3]=hex2c( r[i] );
  1486.                         uname[9][1+i*3]=hex2c( g[i] );
  1487.                         uname[9][2+i*3]=hex2c( b[i] );
  1488.                     }
  1489.                     i=0;
  1490.                     while(mydob->do_ToolTypes[i]!=NULL){
  1491.                         strcpy(uname[i],mydob->do_ToolTypes[i]);
  1492.                         if(i>5) break;
  1493.                         i++;
  1494.                                     }
  1495.                     sprintf( toolstr[0] , "DISPLAYID=%08lx", DisplayID );
  1496.                                         strcpy( toolstr[1] , "DATABASE=" );
  1497.                     strcat( toolstr[1] , Database );
  1498.  
  1499.                                         strcpy( toolstr[2] , "COLORS=" );
  1500.                     strcat( toolstr[2] , uname[9]  );
  1501.  
  1502.                     strcpy( toolstr[3] , "MAXCASS="    );
  1503.                     strcat( toolstr[3] , itos(uname[0],MaxCass) );
  1504.  
  1505.                     strcpy( toolstr[4] , "OSCAN=" );
  1506.                     strcat( toolstr[4] , OscanName[Oscan] );
  1507.  
  1508.                     for(i=0;i<5;i++) mydob->do_ToolTypes[i]=toolstr[i];
  1509.                     PutDiskObject(myname,mydob);
  1510.                     break;
  1511.                                 case 6:    restorecolor();
  1512.                     leave=TRUE;
  1513.                     break;
  1514.                 } /* end switch GadgetID */
  1515.             case IDCMP_GADGETDOWN:
  1516.                       i=(((struct Gadget*)(message->IAddress))->GadgetID);
  1517.                 activegad=i;
  1518.                       if(i==1)    r[index]=message->Code;
  1519.                 if(i==2)    g[index]=message->Code;
  1520.                 if(i==3)    b[index]=message->Code;
  1521.                 if(i==1 || i==2 || i==3) setcolor(index);
  1522.                 
  1523.                 break;
  1524.                 case IDCMP_MOUSEMOVE:
  1525.                       if(activegad==1)    r[index]=message->Code;
  1526.                 if(activegad==2)    g[index]=message->Code;
  1527.                 if(activegad==3)    b[index]=message->Code;
  1528.                 if(activegad==1 || activegad==2 || activegad==3) setcolor(index);
  1529.                 break;
  1530.                     } /* switch class */
  1531.                     GT_ReplyIMsg(message);
  1532.                 } /* while message */
  1533.         } /* leave me */
  1534.         CloseWindow(palwin);
  1535.         FreeGadgets(palcon);
  1536. }
  1537.  
  1538. VOID
  1539. restorecolor(VOID)
  1540. {
  1541.     WORD i;
  1542.  
  1543.     for(i=0;i<4;i++){
  1544.         SetRGB4( &(screen->ViewPort), i , col0[0][i],col0[1][i],col0[2][i]);
  1545.         }
  1546. }
  1547.  
  1548. VOID
  1549. getcolor(WORD index)
  1550. {
  1551.     col=GetRGB4(screen->ViewPort.ColorMap,index);
  1552.     b[index] = (UWORD)  (col & (0x000f));
  1553.     g[index] = (UWORD) ((col & (0x00f0)) >> 4);
  1554.     r[index] = (UWORD) ((col & (0x0f00)) >> 8);
  1555.  
  1556.       if(palwin){
  1557.             GT_SetGadgetAttrs(rslider,palwin,NULL,GTSL_Level,r[index],TAG_DONE,0);
  1558.                GT_SetGadgetAttrs(gslider,palwin,NULL,GTSL_Level,g[index],TAG_DONE,0);
  1559.             GT_SetGadgetAttrs(bslider,palwin,NULL,GTSL_Level,b[index],TAG_DONE,0);
  1560.     }
  1561. }
  1562.  
  1563. VOID
  1564. setcolor(WORD index)
  1565. {
  1566.     SetRGB4( &(screen->ViewPort), index , r[index],g[index],b[index]);
  1567. }
  1568.  
  1569. WORD
  1570. hex2c(WORD hex)
  1571. {
  1572.     if(hex < 10 ) return(hex+48);
  1573.         return(hex+65-10);
  1574. }
  1575.  
  1576.  
  1577.  
  1578. /********************************************************************************
  1579.  *                                                                              *
  1580.  *                print fkts                                      *
  1581.  *                                        *
  1582.  ********************************************************************************/
  1583.  
  1584. BOOL
  1585. InitPrinter( VOID )
  1586. /*
  1587.  *    initializes the printer with the chosen config
  1588.  */
  1589. {
  1590.     WORD i;
  1591.     UBYTE status[2] = {0, 0};
  1592.  
  1593.     PDOPEN = OpenPrinter();
  1594.     if( PDOPEN != TRUE ){
  1595.         usermessage("Can't open printer device\n");
  1596.         return(FALSE);
  1597.     }
  1598. /**
  1599.  | Check if the printer is there... Actually, if the printer is connected
  1600.  | to the serial port, I don't know what to do: in this case I continue,
  1601.  | knowing that a System requester will come after a while. If the printer
  1602.  | is connected to the parallel port, printer selected (bit 0), paper out
  1603.  | (bit 1) and printer offline (bit 2) are checked.
  1604. **/
  1605.     FOREVER {
  1606.             printerReq->ios.io_Command = PRD_QUERY;
  1607.             printerReq->ios.io_Data    = (APTR) status;
  1608.             printerReq->ios.io_Flags   = 0;
  1609.             if (DoIO((struct IORequest *)printerReq)) {
  1610.                 quit("Couldn't communicate with printer!");
  1611.             }
  1612.             if (printerReq->ios.io_Actual == 2)  break;
  1613.             if ((status[0] & 0x7) == 0x4)       break;
  1614.                         easyerror.es_GadgetFormat="I'll check|Cancel";
  1615.             easyerror.es_TextFormat="Please, check if your printer is ready!";
  1616.             if(EasyRequest(NULL,&easyerror,NULL,NULL)==0){
  1617.                                 easyerror.es_GadgetFormat="Ok.";
  1618.                 quit("Pm removed.");
  1619.             }
  1620.             easyerror.es_GadgetFormat="UNDERSTOOD!";
  1621.     }
  1622.     easyerror.es_GadgetFormat="UNDERSTOOD!";
  1623.     return(TRUE);
  1624. }
  1625.  
  1626. VOID
  1627. ResetPrinter( VOID )
  1628. /*
  1629.  *    self explaining
  1630.  */
  1631. {
  1632.     SendCommand(aRIS,0,0,0,0);
  1633. }
  1634.  
  1635. VOID
  1636. SendBuffer( STRPTR buffer , UWORD Mode)
  1637. /*
  1638.  *    Sends the data in buffer to the printer
  1639.  */
  1640. {
  1641.     printerReq->ios.io_Command = Mode;
  1642.     printerReq->ios.io_Data    = (APTR) buffer;
  1643.     printerReq->ios.io_Length  = strlen(buffer);
  1644.     printerReq->ios.io_Flags   = 0;
  1645.  
  1646.     if( DoIO( (struct IORequest *)printerReq ) ) usermessage("Error while DoIO!\n");
  1647. }
  1648.  
  1649. VOID
  1650. SendCommand( UWORD Command , UBYTE par0,par1,par2,par3 )
  1651. /*
  1652.  *    sends a command + parameters to the printer
  1653.  */
  1654. {
  1655.     printerReq->iopc.io_Command     = PRD_PRTCOMMAND;
  1656.     printerReq->iopc.io_Flags       = 0;
  1657.     printerReq->iopc.io_PrtCommand    = Command;
  1658.     printerReq->iopc.io_Parm0    = par0;
  1659.     printerReq->iopc.io_Parm1    = par1;
  1660.     printerReq->iopc.io_Parm2    = par2;
  1661.     printerReq->iopc.io_Parm3    = par3;
  1662.  
  1663.     if(  DoIO( (struct IORequest *)printerReq )  ) usermessage("Error while setting prefs!\n");
  1664. }
  1665.  
  1666. BOOL
  1667. OpenPrinter( VOID )
  1668. /*
  1669.  *    install Port, IORequest, open device
  1670.  */
  1671. {
  1672.     if(printer_mp = CreatePort(NULL,0)){
  1673.         if(printerReq = (union printerIO *)CreateExtIO(printer_mp,sizeof(union printerIO))){
  1674.             if( OpenDevice("printer.device",0,(struct IORequest *)printerReq,0) ==NULL ){
  1675.                 SendBuffer( "\0" , CMD_WRITE );
  1676.                 return(TRUE);
  1677.             }    
  1678.             DeleteExtIO( (struct IORequest *)printerReq );
  1679.         }
  1680.         DeletePort(printer_mp);
  1681.     }
  1682.     return( FALSE );
  1683. }
  1684.  
  1685. VOID
  1686. ClosePrinter( VOID )
  1687. /*
  1688.  *      close printer.device, delete the IOReq and delete the Port
  1689.  */
  1690. {
  1691.     if( PDOPEN == TRUE )    CloseDevice((struct IORequest *)printerReq);
  1692.     if( printerReq )     DeleteExtIO((struct IORequest *)printerReq);
  1693.  
  1694.     if(printer_mp)    DeletePort(printer_mp);
  1695.     printerReq=NULL;
  1696.     printer_mp=NULL;
  1697.     PDOPEN=FALSE;
  1698. }
  1699.  
  1700. ULONG
  1701. ahex2ulong( STRPTR ahex )
  1702. {
  1703.     ULONG     id=0, x=1;
  1704.     WORD    i;
  1705.  
  1706.          for(i=9;i>1;i--){
  1707.               id+= x * c2hex( ahex[i] );
  1708.         x*=16;
  1709.     }
  1710.     return( id );
  1711. }
  1712.